package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.BaseAttributeMapper;
import com.atguigu.tingshu.album.mapper.BaseCategory3Mapper;
import com.atguigu.tingshu.album.mapper.BaseCategoryViewMapper;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.BaseAttribute;
import com.atguigu.tingshu.model.album.BaseCategory3;
import com.atguigu.tingshu.model.album.BaseCategoryView;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/***
 * 分类相关的接口实现类
 *
 * ServiceImpl<M,T> m代表实现类需要的mapper接口，m代表实体类
 */

@Service
public class BaseCategoryServiceImpl
        extends ServiceImpl<BaseCategoryViewMapper,BaseCategoryView>
        implements BaseCategoryService {

    @Autowired
    private BaseAttributeMapper baseAttributeMapper;


    @Autowired
    private BaseCategory3Mapper baseCategory3Mapper;


    @Override
    public List<JSONObject> getCategoryInfo() {
        //获取所有分类数据
        List<BaseCategoryView> baseCategoryViews = list(null);

        //根据一级分类id分组,
        Map<Long, List<BaseCategoryView>> category1Bucket = baseCategoryViews.stream()
                .collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        //从一级桶获取一级分类的name、id和二级分类桶
        //entry set操作集合
        List<JSONObject> category1Json = category1Bucket.entrySet().stream().map(category1 -> {
            //获取一级分类id
            Long category1Id = category1.getKey();
            //获取一级分类name
            String category1Name = category1.getValue().get(0).getCategory1Name();
            //获取一级桶的value，里面包含所有的二级和三级信息
            List<BaseCategoryView> baseCategory2Views = category1.getValue();

            //根据二级id进行分组
            Map<Long, List<BaseCategoryView>> category2Bucket = baseCategory2Views.stream()
                    .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));

            //从二级桶获取二级id和name，以及三级桶
            //entry set操作集合
            List<JSONObject> category2Json = category2Bucket.entrySet().stream().map(category2 -> {
                //获取二级id
                Long category2Id = category2.getKey();
                //获取二级name
                String category2Name = category2.getValue().get(0).getCategory2Name();

                //获取二级桶的value，里面包含所有三级分类信息
                //获取所有的三级分类信息
                List<BaseCategoryView> category3ViewList = category2.getValue();
                //遍历三级分类
                List<JSONObject> category3Json = category3ViewList.stream().map(category3 -> {
                    //获取三级分类id
                    Long category3Id = category3.getCategory3Id();
                    //获取三级分类name
                    String category3Name = category3.getCategory3Name();
                    //创建JSONObject，将三级分类信息装进去
                    JSONObject JSONObject3 = new JSONObject();
                    JSONObject3.put("categoryId", category3Id);
                    JSONObject3.put("categoryName", category3Name);
                    //返回
                    return JSONObject3;
                }).collect(Collectors.toList());

                //创建JSONObject，将二级分类信息装进去
                JSONObject JSONObject2 = new JSONObject();
                JSONObject2.put("categoryId", category2Id);
                JSONObject2.put("categoryName", category2Name);
                //二级分类的子分类 = 三级分类
                JSONObject2.put("categoryChild", category3Json);
                //
                return JSONObject2;
            }).collect(Collectors.toList());
            //创建JSONObject，将二级分类信息装进去
            JSONObject JSONObject1 = new JSONObject();
            JSONObject1.put("categoryId", category1Id);
            JSONObject1.put("categoryName", category1Name);
            //一级分类的子分类 = 二级分类
            JSONObject1.put("categoryChild", category2Json);
            return JSONObject1;

        }).toList();
        //返回给前端
        return category1Json;
    }


    @Override
    public List<BaseAttribute> findAttribute(Long id) {

        return baseAttributeMapper.findAttribute(id);


    }

    @Override
    public List<BaseCategory3> findTopBaseCategory3(Long category1Id) {

        return baseCategory3Mapper.findTopBaseCategory3(category1Id);
    }










































//    @Override
//    public List<JSONObject> getCategoryInfo() {
//        //所有分类
//        List<BaseCategoryView> ListCategoryView = list(null);
//
//        //根据所有分类 归纳出 一级分类二级分类以及三级分类
//        //根据一级分类id进行分组，获取一级分类map；
//        Map<Long, List<BaseCategoryView>> ListCategory1 = ListCategoryView
//                .stream()
//                .collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
//
//        //遍历每个分组
//        List<JSONObject> collect1 = ListCategory1.entrySet().stream().map(category1 -> {
//            JSONObject categoryView1Jsonglist = new JSONObject();
//
//            //一级分类ID
//            Long category1Id = category1.getKey();
//            //
//            categoryView1Jsonglist.put("categoryId", category1Id);
//
//            //一级分类ID对应的全部二级和三级分类
//            List<BaseCategoryView> ListCategory2view = category1.getValue();
//            //获取一级分类名称
//            String category1Name = ListCategory2view.get(0).getCategory1Name();
//            categoryView1Jsonglist.put("categoryName", category1Name);
//            //根据二级分类id进行分组，获取二级分类map
//            Map<Long, List<BaseCategoryView>> ListCategory2 = ListCategory2view.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
//            //对二级分类map进行遍历
//            List<JSONObject> collect2 = ListCategory2.entrySet().stream().map(category2 -> {
//
//                Long category2ID = category2.getKey();
//                //获取全部三级分类
//                List<BaseCategoryView> category3View = category2.getValue();
//                JSONObject categoryView2Jsonglist = new JSONObject();
//                categoryView2Jsonglist.put("categoryId", category2ID);
//
//                //获取二级分类名字
//                String category2Name = category3View.get(0).getCategory2Name();
//                categoryView2Jsonglist.put("categoryName", category2Name);
//
//                //遍历三级分类
//                List<JSONObject> collect3 = category3View.stream().map(category3 -> {
//                    //获取三级分类名字
//                    String category3Name = category3.getCategory3Name();
//                    //获取三级分类id
//                    Long category3Id = category3.getCategory3Id();
//
//                    JSONObject categoryView3Jsonglist = new JSONObject();
//
//                    categoryView3Jsonglist.put("categoryId", category3Id);
//                    categoryView3Jsonglist.put("categoryName", category3Name);
//
//                    return categoryView3Jsonglist;
//                }).collect(Collectors.toList());
//
//                categoryView2Jsonglist.put("categoryChild", collect3);
//                return categoryView2Jsonglist;
//            }).collect(Collectors.toList());
//
//            categoryView1Jsonglist.put("categoryChild", collect2);
//            return categoryView1Jsonglist;
//        }).toList();
//        //返回给前端
//        return collect1;
//    }
}
